package awk.jdk8;

import java.util.function.*;

public class MethodReferenceDemo {
    public static void main(String[] args) {
        Value2 dog = new Value2();
        dog.eat(3);

        // 静态方法的方法引用【类::方法名】 (输入 dog实例， 输出null 是一个消费者)
        Consumer<Value2> consumer = Value2::bark;    // dog1 -> Dog.bark(dog1);
        consumer.accept(dog);

        // 非静态方法，【实例::方法名】
        // Function<Integer, Integer> function = dog::eat;
        // 输入输出均是Integer 可以转换
        // UnaryOperator<Integer> function = dog::eat;
        IntUnaryOperator function = dog::eat;
        // dog = null;  // 实例置空引用不受影响
        int i = function.applyAsInt(2);
        System.out.println("还剩下 " + i + "斤");

        // 非静态方法 【类名::方法名】 有第一个参数this
        BiFunction<Value2,Integer,Integer> function1 = Value2::eat;
        Integer apply = function1.apply(dog, 2);
        System.out.println("还剩下 " + apply + "斤");

        // (无参)构造函数的方法引用， 方法名写死new
        Supplier<Value2> supplier = Value2::new;
        System.out.println("创建了新对象" + supplier.get());

        // 有参数构造方法
        Function<String, Value2> function2 = Value2::new;
        System.out.println("创建了新对象" + function2.apply("旺财"));
    }

    static class Value2 {
        private String name = "哮天犬";
        private int food = 10;
        public Value2() { }
        public Value2(String name) {
            this.name = name;
        }

        /**
         * 狗叫，静态方法 没有可以访问对象实例的 this指针
         */
        public static void bark(Value2 dog) {
            System.out.println(dog.name + "叫了");
        }

        /**
         * 默认会把当前实例传入到非静态方法，参数名为this，位置是第一个；
         * @param num
         * @return 还剩下多少斤
         */
        public int eat(Value2 this,int num) {
            System.out.println("吃了" + num + "斤狗粮");
            this.food -= num;
            return this.food;
        }

        @Override
        public String toString() {
            return this.name;
        }
    }

}


